<?php

namespace auxiliary\timer;

use Workerman\Lib\Timer;
use auxiliary\traits\Singleton;
use Closure;

class TimerGroup
{
    use Singleton;

    /**
     * 定时任务列表
     * @var array
     */
    private array $timerList = [];

    /**
     * 注入定时任务
     * @param string $uniqueKey 唯一的Key名
     * @param int $interval 间隔时间，单位：秒
     * @param Closure|array $callback 回调函数
     * @param array|string $args       回调参数
     * @param bool $cycle
     * @return bool
     */
    public function bind(string $uniqueKey, int $interval, $callback, $args = [], bool $cycle = true): bool
    {
        if($this->checkHasBind($uniqueKey)){
            return false;
        }
        $this->timerList[$uniqueKey] = Timer::add($interval, $callback, $args, $cycle);
        workerLog('/timer', '增加了一个定时任务：' . $uniqueKey . PHP_EOL . '间隔时间：' . $interval . '秒' . PHP_EOL . '是否循环：' . ($cycle ? '是' : '否') . PHP_EOL . '定时任务列表：' . json_encode(array_keys($this->timerList)));
        return true;
    }

    /**
     * 判断是否存在定时任务
     * @param string $uniqueKey 唯一的Key名
     * @return bool
     */
    public function checkHasBind(string $uniqueKey): bool
    {
        return (isset($this->timerList[$uniqueKey]) and !empty($this->timerList[$uniqueKey]));
    }

    /**
     * 删除定时任务
     * @param string $uniqueKey 唯一的Key名
     * @return bool
     */
    public function unbind(string $uniqueKey): bool
    {
        if($this->checkHasBind($uniqueKey)){
            Timer::del($this->timerList[$uniqueKey]);
            unset($this->timerList[$uniqueKey]);
            workerLog('/timer', '删除了一个定时任务：' . $uniqueKey . PHP_EOL . '定时任务列表：' . json_encode(array_keys($this->timerList)));
            return true;
        }
        return false;
    }

}